package cn.iocoder.yudao.module.call.service.agent;

import cn.hutool.json.JSONObject;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.call.controller.admin.agent.vo.*;
import cn.iocoder.yudao.module.call.controller.admin.agent.vo.admin.AgentSaveByAdminReqVO;
import cn.iocoder.yudao.module.call.controller.admin.agent.vo.admin.AgentUpdateByAdminReqVO;
import cn.iocoder.yudao.module.call.dal.dataobject.agent.AgentDO;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 坐席 Service 接口
 *
 * @author 我
 */
public interface AgentService {

    /**
     * 创建坐席
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createAgent(@Valid AgentSaveReqVO createReqVO);

    /**
     * 更新坐席
     *
     * @param updateReqVO 更新信息
     */
    void updateAgent(@Valid AgentSaveReqVO updateReqVO);

    void updateAgent(@Valid AgentDO agentDO);


    /**
     * 删除坐席
     *
     * @param id 编号
     */
    void deleteAgent(Long id);

    /**
     * 获得坐席
     *
     * @param id 编号
     * @return 坐席
     */
    AgentDO getAgent(Long id);

    /**
     * 获取当前登录用户的坐席
     * @since 2024-03-14
     * @author PetePower
     * @return 坐席对象
     */
    AgentDO getAgent();

    /**
     * 获得坐席分页
     *
     * @param pageReqVO 分页查询
     * @return 坐席分页
     */
    PageResult<AgentDO> getAgentPage(AgentPageReqVO pageReqVO);

    /**
     * 坐席点呼
     * @param callReqVO 输入参数
     * @since 2024-03-11
     * @author PetePower
     */
    CallRespVO simpleCall(CallReqVO callReqVO);

    /**
     * 根据会话单号获取通话记录
     * @param reqNo
     * @since 2024-05-29
     * @author PetePower
     * @return
     */
    String getCallByReqNo(String reqNo);

    /**
     * 检查账户话费余额
     * @param mode
     * @param id
     * @since 2024-05-29
     * @author PetePower
     */
    void checkBillBalance(String mode, Long id);

    /**
     * 映射话机盒子id和本地reqNo 关系
     * @param params
     * @since 2024-04-22
     * @author PetePower
     * @return
     */
    String mapCallIdAndReqNo(Map<String, String> params);

    /**
     * 根据呼叫模式获取渠道id
     * @param phoneMode
     * @since 2024-04-22
     * @author PetePower
     * @return
     */
    Long getChannel(String phoneMode);


    /**
     * 获取sip登录账号，目前仅okcc需要用到
     * @param channelId 渠道id
     * @since 2024-03-14
     * @author PetePower
     * @return 登录账号信息
     */
    JSONObject getAccountInfo(Long channelId);


    /**
     * 坐席操作
     * @param data {type: agentLogin, agent: agentNumber, channelId: Long }
     * @since 2024-03-14
     * @author PetePower
     * @return
     */
    Boolean handleAgent(Map<String, Object> data);


    /**
     * 获取客户信息（客户名称，跟进记录）
     *
     * @param reqNo 话单id
     * @return 客户信息
     * @author PetePower
     * @since 2024-03-20
     */
    Map<String, Object> getCustomerInfo(String reqNo);


    /**
     * 给指定客户写跟进内容
     *
     * @author PetePower
     * @since 2024-03-21
     */
    void addCustomerFollowRecord(CallAddFollowRecordReqVO regVO);

    /**
     * 定时刷新坐席过期状态
     * Scheduled 1 hour
     *
     * @author PetePower
     * @since 2024-05-06
     */
    void refreshAgentExpireStatus();

    /**
     * 更新坐席状态
     * @param data
     * @since 2024-11-01
     * @author PetePower
     * @return
     */
    Boolean updateAgentStatus(Map<String, String> data);

    /**
     * 超管模式下创建指定数量的坐席
     *
     * @param reqVO 入参
     * @return
     * @author PetePower
     * @since 2024-11-05
     */
    Boolean createAgentByAdmin(AgentSaveByAdminReqVO reqVO);

    /**
     * 超管模式下更新指定坐席
     *
     * @param updateReqVO
     * @author PetePower
     * @since 2024-11-05
     */
    void updateAgentByAdmin(AgentUpdateByAdminReqVO updateReqVO);

    /**
     * 超管批量更新坐席
     * @param updateReqVO
     * @since 2024-11-06
     * @author PetePower
     */
    void batchUpdateAgentByAdmin(AgentUpdateByAdminReqVO updateReqVO);


    /**
     * 根据groupId查询坐席
     * @param groupId
     * @return
     */
    List<AgentDO> selectByGroupId(Long groupId);

    /**
     * 坐席激活，心跳保持
     * 前端在sip注册完成后， 每10秒去更新这个坐席的在线状态， 防止前端重复注册
     * @param loginUserId
     * @since 2025-01-03
     * @author PetePower
     */
    void active(Long loginUserId);
}